﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ParallelGrep.Utility
{
    /// <summary>
    /// ファイルプロパティダイアログクラス
    /// </summary>
    public sealed class FilePropertiesDialog
    {
        #region FileProperties API

        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        static extern bool ShellExecuteEx(ref ShellExecuteInfo lpExecInfo);
        /// <summary>
        /// ShellExecuteEx 関数で作成されるプロセスの情報を定義します。
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct ShellExecuteInfo
        {
            /// <summary>
            /// 構造体サイズ
            /// </summary>
            public int cbSize;
            /// <summary>
            /// オプション
            /// </summary>
            public uint fMask;
            /// <summary>
            /// 親ウィンドウ
            /// </summary>
            public IntPtr hwnd;
            /// <summary>
            /// 動作名
            /// </summary>
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpVerb;
            /// <summary>
            /// ファイル名
            /// </summary>
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpFile;
            /// <summary>
            /// コマンドラインパラメータ
            /// </summary>
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpParameters;
            /// <summary>
            /// 起動ディレクトリ
            /// </summary>
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpDirectory;
            /// <summary>
            /// 表示形式
            /// </summary>
            public int nShow;
            /// <summary>
            /// 結果値
            /// </summary>
            public IntPtr hInstApp;
            /// <summary>
            /// アイテムIDリスト
            /// </summary>
            public IntPtr lpIDList;
            /// <summary>
            /// クラス名
            /// </summary>
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpClass;
            /// <summary>
            /// ファイルクラスのレジストリキー
            /// </summary>
            public IntPtr hkeyClass;
            /// <summary>
            /// ホットキー
            /// </summary>
            public uint dwHotKey;
            /// <summary>
            /// ファイルクラスのアイコン
            /// </summary>
            public IntPtr hIcon;
            /// <summary>
            /// プロセスハンドル
            /// </summary>
            public IntPtr hProcess;
        }
        private const int SW_SHOW = 5;
        private const uint SEE_MASK_INVOKEIDLIST = 12;
        #endregion

        #region ShowDialog
        /// <summary>
        /// 指定したファイル名で、プロパティダイアログを表示します。
        /// </summary>
        ///<param name="fileName">ファイル名</param>
        public static void ShowDialog(string fileName)
        {
            ShellExecuteInfo info = new ShellExecuteInfo();
            info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info);
            info.lpVerb = "properties";
            info.lpFile = fileName;
            info.nShow = SW_SHOW;
            info.fMask = SEE_MASK_INVOKEIDLIST;
            ShellExecuteEx(ref info);
        }
        #endregion
    }
}
